home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / HDXPRSV.502 / UPDATE < prev    next >
Encoding:
Text File  |  2001-02-09  |  4.6 KB  |  197 lines

  1. chkroot(dev, bs)
  2. int dev;
  3. char *bs;
  4. {
  5.     extern long get3bytes();
  6.     extern long get4bytes();
  7.     SETMODE *mb;
  8.     int i, ret, set, scsidrv, mask=0x0001;
  9.     int page=4, bsiz;
  10.     int head, spt;
  11.     SECTOR size, msiz, cyl;    /* size of media */
  12.     char buf[512], sendata[32];
  13.     long dmaptr, tmpptr;
  14.     char *dmahigh=0xffff8609,
  15.          *dmamid=0xffff860b,
  16.          *dmalow=0xffff860d;
  17.     
  18.     size = ((RSECT *)(bs + 0x200 - sizeof(RSECT)))->hd_siz;
  19.     
  20.     ret = OK;
  21.     if (dev == 16)    {        /* it is a IDE-AT drive */
  22.         msiz = (SECTOR)athead * (SECTOR)atcyl * (SECTOR)atspt;
  23.         if (size != msiz)
  24.             ret = ERROR;
  25.         return(ret);
  26.     } else if (dev > 7)    {    /* it is a scsi drive */
  27.         ostack = Super(NULL);
  28.         delay();
  29.         if ((ret = readcap(dev, 0, (long)0, sendata)) == OK) {
  30.             if (msiz = get4bytes(sendata))    {
  31.                 msiz += 1;
  32.                 delay();
  33.                 Super(ostack);
  34.                 goto chkend;
  35.             } 
  36.         } 
  37.         for (i = 0; i < 32; i++)
  38.             sendata[i] = 0;
  39.         if ((ret = mdsense(dev, 4, 0, 32, sendata)) == OK)    {
  40.             if((msiz=get3bytes(sendata+5)))    {
  41.                         delay();
  42.                         Super(ostack);
  43.                         goto chkend;
  44.             }
  45.         }
  46.         for (i = 0; i < 32; i++)
  47.             sendata[i] = 0;
  48.         if ((ret = mdsense(dev, 0, 0, 16, sendata)) == OK)    {
  49.             if((msiz=get3bytes(sendata+5)))    {
  50.                         delay();
  51.                         Super(ostack);
  52.                         goto chkend;
  53.             }
  54.         }
  55.         for (i = 0; i < 32; i++)
  56.             sendata[i] = 0;
  57.         if ((ret = mdsense(dev, 3, 0, 32, sendata)) == OK)    {
  58.             if((msiz=get3bytes(sendata+5)))    {
  59.                         delay();
  60.                         Super(ostack);
  61.                         goto chkend;
  62.             }
  63.         }
  64.         msiz = size;
  65.         delay();
  66.         Super(ostack);
  67.         goto chkerr;
  68.     }
  69.  
  70.     ostack = Super(NULL);
  71.     /* Get format parameters/ disk size from media */
  72.     set = typedev & (mask << dev);
  73.     scsidrv = typedrv & (mask << dev);
  74.     bsiz = ((set) || (scsidrv)) ? (16) : (22);
  75.     if ((set) || (scsidrv))    {
  76.         for (i = 0; i < 32; i++)
  77.             sendata[i] = 0;
  78.         mdsense(dev, 0, 0, bsiz, sendata);
  79.         if((msiz=get3bytes(sendata+5)))    {
  80.                     delay();
  81.                     Super(ostack);
  82.                     goto chkend;
  83.         }
  84. redopg:
  85.         for (i = 0; i < 32; i++)
  86.             sendata[i] = 0;
  87.         ret = mdsense(dev, page, 0, 32, sendata);/* use page code 4, but get */
  88.                                             /* info from the mdsense header */
  89.         for (i = 0; i < 32; i++)
  90.             if (sendata[i])
  91.                 break;
  92.         if ((i==32) && (page == 4))        {
  93.             page = 3;
  94.             goto redopg;
  95.         } else if (i == 32)    {
  96.             msiz = size;
  97.             delay();
  98.             Super(ostack);
  99.             goto chkend;
  100.         }
  101.         if (!(msiz = get3bytes(sendata+5)))    {
  102.             if (page == 4)    {
  103.                 page = 3;
  104.                 /*
  105.                 cyl = get3bytes(sendata+14);
  106.                 head = *(sendata+17);
  107.                 */
  108.                 goto redopg;
  109.             } else {
  110.                 /*
  111.                 spt = getword(sendata+22);
  112.                 msiz = cyl * head * spt;
  113.                 */
  114.                 msiz = size;
  115.             }
  116.         }
  117.         delay();
  118.         Super(ostack);
  119.         goto chkend;
  120.     } else    {
  121.         ret = mdsense(dev, 0, 0, 22, sendata);
  122.         delay();
  123.         Super(ostack);
  124.  
  125.         /* If full SCSI, will return number of blocks */
  126.         /* on disk at byte 5, 6 and 7.  If Adaptec,   */
  127.         /* will return 0 for number of blocks on disk */
  128.         /* on SCSI. */
  129.  
  130.             if (!(msiz = get3bytes(sendata+5))) {    /* no disk size returned? */
  131.             /* Yup, ie., it's adaptec's.  Interpret as SETMODE structure */
  132.             mb = (SETMODE *)sendata;
  133.             /* get number of cylinders */
  134.             cyl = mb->smd_cc[0];
  135.             cyl <<= 8;
  136.             cyl |= mb->smd_cc[1];
  137.     
  138.             /* get number of heads */
  139.             head = mb->smd_dhc;
  140.     
  141.             msiz = (SECTOR)head * (SECTOR)cyl * MFM;
  142.     
  143.             for (i = 0; i < 20; i++) {
  144.                 if ((ret = rdsects(dev, 1, buf, msiz+i)) == OK) {
  145.                     /* find out whether data has been transferred, by
  146.                           checking if dma pointer has been moved.      */
  147.  
  148.                     ostack = Super(NULL);
  149.                     delay();
  150.                     dmaptr = *dmahigh;
  151.                     dmaptr &= 0x0000003f;
  152.                     dmaptr <<= 16;
  153.                     tmpptr = *dmamid;
  154.                     tmpptr &= 0x000000ff;
  155.                     tmpptr <<= 8;
  156.                     dmaptr |= tmpptr;
  157.                     tmpptr = *dmalow;
  158.                     tmpptr &= 0x000000ff;
  159.                     dmaptr |= tmpptr;
  160.                     delay();
  161.                     Super(ostack);
  162.  
  163.                     if (dmaptr != buf)
  164.                         break;
  165.                    } else {            /* rdsects return an error */
  166.                     if (tsterr(ret) == OK) {
  167.                            break;
  168.                     }
  169.                 }
  170.             }
  171.     
  172.             if (ret == MDMCHGD)        /* check if error occurred */
  173.                 return (ret);
  174.        
  175.             /* Determine if media is MFM or RLL */
  176.             if (i < 20)    {
  177.                 msiz = (SECTOR)head * (SECTOR)cyl * RLL;
  178.                 goto chkend;
  179.             }
  180.         }
  181.     }
  182. chkerr:
  183.     if (ret != 0) {
  184.         ret = errcode(dev);
  185.         if (tsterr(ret) != OK) 
  186.             return ERROR;
  187.         return (-3);    /* don't have to show the alert box */
  188.     }
  189. chkend:
  190.     if (size != msiz)
  191.         ret = ERROR;
  192.     else 
  193.         ret = OK;
  194.         
  195.     return (ret);
  196. }
  197.